import macro from 'vtk.js/Sources/macro'

export default function widgetBehavior(publicAPI, model) {
  model.classHierarchy.push('vtkAxesLabelsWidgetProp')
  let isDragging = null

  // --------------------------------------------------------------------------
  // Display 2D
  // --------------------------------------------------------------------------

  publicAPI.setDisplayCallback = callback =>
    model.representations[0].setDisplayCallback(callback)

  // --------------------------------------------------------------------------
  // Interactor events
  // --------------------------------------------------------------------------

  function ignoreKey(e) {
    return e.altKey || e.controlKey || e.shiftKey
  }

  // --------------------------------------------------------------------------
  // Right click: Delete handle
  // --------------------------------------------------------------------------

  publicAPI.handleRightButtonPress = e => {
    if (
      !model.activeState ||
      !model.activeState.getActive() ||
      !model.pickable ||
      ignoreKey(e)
    ) {
      return macro.VOID
    }

    //if (model.activeState !== model.widgetState.getMoveHandle()) {
    //model.interactor.requestAnimation(publicAPI)
    //model.activeState.deactivate()
    //model.widgetState.removeHandle(model.activeState)
    //model.activeState = null
    //model.interactor.cancelAnimation(publicAPI)
    //}

    publicAPI.invokeStartInteractionEvent()
    publicAPI.invokeInteractionEvent()
    publicAPI.invokeEndInteractionEvent()
    return macro.EVENT_ABORT
  }

  // --------------------------------------------------------------------------
  // Left press: Select handle to drag
  // --------------------------------------------------------------------------

  publicAPI.handleLeftButtonPress = e => {
    if (
      !model.activeState ||
      !model.activeState.getActive() ||
      !model.pickable ||
      ignoreKey(e)
    ) {
      return macro.VOID
    }

    //if (model.activeState === model.widgetState.getMoveHandle()) {
    //// Commit handle to location
    //const moveHandle = model.widgetState.getMoveHandle()
    //const newHandle = model.widgetState.addHandle()
    //newHandle.setOrigin(...moveHandle.getOrigin())
    //newHandle.setColor(moveHandle.getColor())
    //newHandle.setScale1(moveHandle.getScale1())
    //} else {
    //isDragging = true
    //model.openGLRenderWindow.setCursor('grabbing')
    //model.interactor.requestAnimation(publicAPI)
    //}

    publicAPI.invokeStartInteractionEvent()
    return macro.EVENT_ABORT
  }

  // --------------------------------------------------------------------------
  // Mouse move: Drag selected handle / Handle follow the mouse
  // --------------------------------------------------------------------------

  publicAPI.handleMouseMove = callData => {
    //if (
    //model.pickable &&
    //model.manipulator &&
    //model.activeState &&
    //model.activeState.getActive() &&
    //!ignoreKey(callData)
    //) {
    //model.manipulator.setOrigin(model.activeState.getOrigin())
    //model.manipulator.setNormal(model.camera.getDirectionOfProjection())
    //const worldCoords = model.manipulator.handleEvent(
    //callData,
    //model.openGLRenderWindow
    //)

    //if (
    //model.activeState === model.widgetState.getMoveHandle() ||
    //isDragging
    //) {
    //model.activeState.setOrigin(worldCoords)
    //publicAPI.invokeInteractionEvent()
    //return macro.EVENT_ABORT
    //}
    //}
    if (model.hasFocus) {
      model.widgetManager.disablePicking()
    }
    return macro.VOID
  }

  // --------------------------------------------------------------------------
  // Left release: Finish drag / Create new handle
  // --------------------------------------------------------------------------

  publicAPI.handleLeftButtonRelease = () => {
    if (isDragging && model.pickable) {
      model.openGLRenderWindow.setCursor('pointer')
      model.widgetState.deactivate()
      model.interactor.cancelAnimation(publicAPI)
      publicAPI.invokeEndInteractionEvent()
      //} else if (model.activeState !== model.widgetState.getMoveHandle()) {
      //model.widgetState.deactivate()
    }

    if (
      (model.hasFocus && !model.activeState) ||
      (model.activeState && !model.activeState.getActive())
    ) {
      publicAPI.invokeEndInteractionEvent()
      model.widgetManager.enablePicking()
      model.interactor.render()
    }

    isDragging = false
  }

  // --------------------------------------------------------------------------
  // Escape key: Release focus to switch to drag mode
  // --------------------------------------------------------------------------

  publicAPI.handleKeyDown = ({ key }) => {
    if (key === 'Escape') {
      publicAPI.loseFocus()
    }
  }

  // --------------------------------------------------------------------------
  // Focus API - modeHandle follow mouse when widget has focus
  // --------------------------------------------------------------------------

  publicAPI.grabFocus = () => {
    //if (!model.hasFocus) {
    //model.activeState = model.widgetState.getMoveHandle()
    //model.activeState.activate()
    //model.activeState.setVisible(true)
    //model.interactor.requestAnimation(publicAPI)
    //publicAPI.invokeStartInteractionEvent()
    //}
    model.hasFocus = true
  }

  // --------------------------------------------------------------------------

  publicAPI.loseFocus = () => {
    if (model.hasFocus) {
      model.interactor.cancelAnimation(publicAPI)
      publicAPI.invokeEndInteractionEvent()
    }
    model.widgetState.deactivate()
    //model.widgetState.getMoveHandle().deactivate()
    //model.widgetState.getMoveHandle().setVisible(false)
    model.activeState = null
    model.hasFocus = false
    model.widgetManager.enablePicking()
    model.interactor.render()
  }
}
